查看原文
其他

Spring Boot系列之项目国际化

jzman 躬行之 2022-08-26

PS:21号,中行原油宝碰到了历史上最低结算价,按照-37.63美元/桶结算,要投资者按照-266.12元/桶结算价平仓,事后发短信要求投资者即刻补足交割款,这意味着投资者,不但除了亏光保证金,剩下的要按-266块/桶倒贴,这里面有一个投资常识,不懂的一定不投,不要盲目去抄底。
前面几篇文章尝试了接口开发、Thymeleaf 模板、常用语法及模板布局,阅读本文之前可以阅读前面几篇:
Spring Boot 项目的国际化实现起来非常简单,为了保证 Spring Boot 系列的连续性,其项目的国际化化也单独为一篇文章,主要内容如下:
  1. 区域解析器

  2. 创建国际化配置文件

  3. 创建配置类

  4. 测试效果

区域解析器

Spring 中提供区域解析器来识别用户区域,依次来实现 Web 应用程序的国际化,区域解析器必须实现 LocalResolver 接口,也可以实现实现该接口创建自己的区域解析器
  • AcceptHeaderLocaleResolver:默认区域解析器,通过 HTTP 请求的 accept-language 参数来解析区域;

  • SessionLocaleResolver:在当前会话有效,否则还原为默认状态;

  • CookieLocaleResolver:在当前 Cookie 有效期内有效,否则还原为默认状态;

  • FixedLocaleResolver:设置固定的 Local,不便于动态改变 Local;

  • 使用 LocaleChangeInterceptor 拦截器解析用户区域。

下面将以 LocaleChangeInterceptor 拦截器和 SessionLocaleResolver 为例实现 Spring Boot 项目的国际化。

创建国际化配置文件

Spring Boot 是支持国际化的,使用起来也比较方便,创建 Spring Boot 项目,在 resources 下创建一个名称为 i18n 的文件夹,然后右击依次选择 New->Resourc Bundle 创建于个语言对应的配置文件 home.properties 文件,如下:
躬行之
然后在配置文件 application.properties 文件中配置 Message 路径,如下:
# Message路径
spring.messages.basename=i18n.home
home.properties 属性文件中的值如何获取呢,如下:
mMessageSource.getMessage("home.title"null, LocaleContextHolder.getLocale());

创建配置类

使用 LocaleChangeInterceptor 拦截器和 SessionLocaleResolver,其设置的参数就是对应的 Local ,如下:
/**
 * I18nConfig
 */

@Configuration
public class I18nConfig {

    @Bean
    public LocaleResolver localeResolver (){
        return new SessionLocaleResolver();
    }

    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                LocaleChangeInterceptor changeInterceptor = new LocaleChangeInterceptor();
                changeInterceptor.setParamName("lang");
                registry.addInterceptor(changeInterceptor);
            }
        };
    }
}

案例代码

I18nController 如下:
@Controller
public class I18nController {

    @GetMapping(value = "/i18n")
    public String il8n() {
        return "i18n";
    }
}
模板文件如下:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Spring Boot I18n Sample.</title>

        <script>
            /**
             * 页面加载完成后调用
             */
            onload = function() {
                let href = window.location.toString();
                let suffix = href.substring(href.length - 2, href.length);
                let lang = document.getElementsByClassName("lang");
                console.log("--suffix--" + suffix);
                switch (suffix) {
                    case "CN":
                        setStatus(lang[0], lang[1], lang[2]);
                        break;
                    case "TW":
                        setStatus(lang[1], lang[0], lang[2]);
                        break;
                    case "US":
                        setStatus(lang[2], lang[1], lang[0]);
                        break;
                    default:
                        setStatus(lang[0], lang[1], lang[2]);
                }
            };

            /**
             * 设置语言标签状态
             * @param show 已选择的语言标签
             * @param def1 未选择的语言标签
             * @param def2 未选择的语言标签
             */
            function setStatus(show, def1, def2) {
                show.style.color = "rgb(0,0,255)";
                def1.style.color = "rgb(0,0,0)";
                def2.style.color = "rgb(0,0,0)";
            }
        
</script>
    </head>
    <body>
        <h3 th:text="#{home.title}">default</h3>
        <p style="font-size: 12px">
            <a class="lang" href="i18n?lang=zh_CN"> 简体中文 </a>|
            <a class="lang" href="i18n?lang=zh_TW"> 繁体中文 </a>|
            <a class="lang" href="i18n?lang=en_US"> English</a>
        </p>
    </body>
</html>

测试效果

运行效果如下:
可以添加在公众号回复关键字【加群】邀你进微信交流群,回复关键字【Spring Boot】获取对应案例源码链接。
推荐文章:

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存